package com.ttg.web.service.job.impl;

import com.ttg.common.dto.TaskAcctDTO;
import com.ttg.common.dto.TaskBaseDTO;
import com.ttg.common.enums.AccountDimTypeEnum;
import com.ttg.common.enums.AccountItemTypeEnum;
import com.ttg.common.utils.BigDecimalUtils;
import com.ttg.common.utils.IntegerUtil;
import com.ttg.common.vo.TaskResultVO;
import com.ttg.model.po.AccountInfoPO;
import com.ttg.model.po.AcctAnalysisPO;
import com.ttg.model.pojo.CostManageAcctComprehensiveAnalysis;
import com.ttg.web.dao.CostManageAcctComprehensiveAnalysisDao;
import com.ttg.web.dao.CostManageAcctDepositAnalysisDao;
import com.ttg.web.dao.CostManageIndustryDepositLoanDao;
import com.ttg.web.service.job.AcctComprehensiveAnalysisJobService;
import com.ttg.web.service.job.JobCommon;
import com.ttg.web.utils.AccountItemTypeUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.List;

/**
 * Description： 直绑/全量账户综合结构分解清算
 * Author: chenyou
 * Date: 2025/9/23 16:32
 * Company: ttg
 * Copyright: Copyright (c) 2025
 */
@Service
public class AcctComprehensiveAnalysisJobServiceImpl extends JobCommon implements AcctComprehensiveAnalysisJobService {

    @Autowired
    private CostManageIndustryDepositLoanDao industryDepositLoanDao;
    @Autowired
    private CostManageAcctDepositAnalysisDao depositAnalysisDao;
    @Autowired
    private CostManageAcctComprehensiveAnalysisDao comprehensiveAnalysisDao;

    @Override
    public TaskResultVO acctComprehensiveAnalysis(TaskAcctDTO reqDto) {
        TaskBaseDTO baseDTO = new TaskBaseDTO();
        BeanUtils.copyProperties(reqDto,baseDTO);
        baseDTO = getCheckYearAndMonth(baseDTO);
        BeanUtils.copyProperties(baseDTO,reqDto);

        List<AccountInfoPO> acctList = null;
        if(IntegerUtil.equals(AccountDimTypeEnum.直绑账户.getValue(),reqDto.getAcctDimType())){
            //todo 全部直绑账户数据
            acctList = getBindAcctList();
            execJob(reqDto,acctList);
        }else if(IntegerUtil.equals(AccountDimTypeEnum.全量账户.getValue(),reqDto.getAcctDimType())){
            //todo 全部全量账户数据
            acctList = getAllAcctList();
            execJob(reqDto,acctList);
        }else{//默认跑批 直绑账户和全量账户数据
            //todo 全部直绑账户数据
            acctList = getBindAcctList();
            execJob(reqDto,acctList);
            //todo 全部全量账户数据
            acctList = getAllAcctList();
            execJob(reqDto,acctList);
        }

        return taskReuslt(Status.SUCCESS.getValue(),false,"ok");
    }

    public void execJob(TaskAcctDTO reqDto,List<AccountInfoPO> acctList){
        for(AccountItemTypeEnum curr:AccountItemTypeEnum.values()){
            acctComprehensiveAnalysis(reqDto, curr,acctList);
        }
    }

    /**
     * 直绑/全量账户指定项目清算
     * 各项金额计算有依赖关系，需严格按如下顺序执行: 收入->支出->净支出->累计支出->模拟利率
     */
    public void acctComprehensiveAnalysis(TaskAcctDTO reqDto, AccountItemTypeEnum itemType, List<AccountInfoPO> acctList){
        CostManageAcctComprehensiveAnalysis comprehensiveAnalysis = new CostManageAcctComprehensiveAnalysis();
        comprehensiveAnalysis.setCmacIntervalType(reqDto.getIntervalType());
        comprehensiveAnalysis.setCmacAcctDimType(reqDto.getAcctDimType());
        comprehensiveAnalysis.setCmacItemType(itemType.getValue());
        comprehensiveAnalysis.setCmacYear(reqDto.getYear());
        comprehensiveAnalysis.setCmacMonth(reqDto.getMonth());
        //收入
        BigDecimal incomeAmt = incomeAmt(reqDto,itemType,acctList);
        comprehensiveAnalysis.setCmacIncomeAmt(incomeAmt);
        //支出
        BigDecimal outAmt = outAmt(reqDto,itemType,acctList);
        comprehensiveAnalysis.setCmacOutAmt(outAmt);
        //净支出
        BigDecimal netOutAmt = netOutAmt(itemType,acctList);
        comprehensiveAnalysis.setCmacNetOutAmt(netOutAmt);
        //累计支出
        BigDecimal aggregateOutAmt = aggregateOutAmt(reqDto,itemType,acctList);
        comprehensiveAnalysis.setCmacAggregateOutAmt(aggregateOutAmt);
        //模拟利率
        BigDecimal rate = rate(reqDto,itemType,acctList);
        comprehensiveAnalysis.setCmacRate(rate);
        //保存清算结果
        comprehensiveAnalysisDao.saveOrUpd(comprehensiveAnalysis);
    }


    /**
     * 收入计算（按年/月） 记：M列
     * 综合付息(M1)：0
     * 结算手续费(M2)：对照年/月晋享易付商户手续费收入金额合计数
     * 云音响费用(M3)：0
     * 绩效和计价(M4)：0
     * 涉贷利息差(M5)：在“成本管理”下“行业存贷信息”中取对照期间时段的Y*V值
     */
    public BigDecimal incomeAmt(TaskAcctDTO reqDto, AccountItemTypeEnum itemType, List<AccountInfoPO> acctList){
        BigDecimal incomeAmt ;
        switch (itemType) {
            case 综合付息:
                incomeAmt = BigDecimal.ZERO;
                break;
            case 结算手续费:
                //todo
                incomeAmt = BigDecimal.ZERO;
                break;
            case 云音响费用:
                incomeAmt = BigDecimal.ZERO;
                break;
            case 绩效和计价:
                incomeAmt = BigDecimal.ZERO;
                break;
            case 涉贷利息差:
                //todo
                incomeAmt = BigDecimal.ZERO;
                break;
            default:
                incomeAmt = BigDecimal.ZERO;
        }
        AccountItemTypeUtil.putResult(itemType,"M",incomeAmt);
        return incomeAmt;
    }

    /**
     * 支出计算（按年/月） 记：N列
     * 综合付息(N1)：模拟付息合计（对公户+储蓄户）
     * 结算手续费(N2)：对照年/月晋享易付商户手续费支出金额合计数
     * 云音响费用(N3)：从“云喇叭管理/耗材申报管理”中取对照期间领用或换新数据*单价？
     * 绩效和计价(N4)：在“成本管理”下“其他成本备案”中取对照期间时段小计列数值
     * 涉贷利息差(N5)：0
     */
    public BigDecimal outAmt(TaskAcctDTO reqDto, AccountItemTypeEnum itemType, List<AccountInfoPO> acctList){
        BigDecimal outAmt;
        switch (itemType) {
            case 综合付息:
                AcctAnalysisPO po = new AcctAnalysisPO();
                po.setIntervalType(reqDto.getIntervalType());
                po.setAcctDimType(reqDto.getAcctDimType());
                po.setYear(reqDto.getYear());
                po.setMonth(reqDto.getMonth());
                outAmt = depositAnalysisDao.sumPayInterest(po);
                break;
            case 结算手续费:
                //todo
                outAmt = BigDecimal.ZERO;
                break;
            case 云音响费用:
                //todo
                outAmt = BigDecimal.ZERO;
                break;
            case 绩效和计价:
                //todo
                outAmt = BigDecimal.ZERO;
                break;
            case 涉贷利息差:
                outAmt = BigDecimal.ZERO;
                break;
            default:
                outAmt = BigDecimal.ZERO;
        }
        AccountItemTypeUtil.putResult(itemType,"N",outAmt);
        return outAmt;
    }

    /**
     * 净支出计算（按年/月） 记：O列
     * 综合付息(O1)：O1=N1
     * 结算手续费(O2)：O2=(M2-N2)
     * 云音响费用(O3)：O3=N3
     * 绩效和计价(O4)：O4=N4
     * 涉贷利息差(O5)：O5=(M5-N5)
     */
    public BigDecimal netOutAmt(AccountItemTypeEnum itemType, List<AccountInfoPO> acctList){
        BigDecimal netOutAmt;
        switch (itemType) {
            case 综合付息:
//                O1=N1
                netOutAmt = AccountItemTypeUtil.getResult(AccountItemTypeEnum.综合付息,"N");
                break;
            case 结算手续费:
//                O2=(M2-N2)
                BigDecimal m2 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.结算手续费,"M");
                BigDecimal n2 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.结算手续费,"N");
                netOutAmt = BigDecimalUtils.sub(m2,n2);
                break;
            case 云音响费用:
//                O3=N3
                BigDecimal n3 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.云音响费用,"N");
                netOutAmt = n3;
                break;
            case 绩效和计价:
//                O4=N4
                BigDecimal n4 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.绩效和计价,"N");
                netOutAmt = n4;
                break;
            case 涉贷利息差:
//                O5=(M5-N5)
                BigDecimal m5 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.涉贷利息差,"M");
                BigDecimal n5 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.涉贷利息差,"N");
                netOutAmt = BigDecimalUtils.sub(m5,n5);
                break;
            default:
                netOutAmt = BigDecimal.ZERO;
        }
        AccountItemTypeUtil.putResult(itemType,"O",netOutAmt);
        return netOutAmt;
    }

    /**
     * 累计支出（按年/月） 记：Q列
     * 综合付息(Q1)：Q1=Ds(合计模拟付息)
     * 结算手续费(Q2)：Q2=Q1+O2
     * 云音响费用(Q3)：Q3=Q2+O3
     * 绩效和计价(Q4)：Q4=Q3+O4
     * 涉贷利息差(Q5)：Q5=Q4+O5
     */
    public BigDecimal aggregateOutAmt(TaskAcctDTO reqDto, AccountItemTypeEnum itemType, List<AccountInfoPO> acctList){
        BigDecimal aggregateOutAmt;

        switch (itemType) {
            case 综合付息:
                //合计模拟付息金额
//                Q1=Ds
                AcctAnalysisPO po = new AcctAnalysisPO();
                po.setIntervalType(reqDto.getIntervalType());
                po.setAcctDimType(reqDto.getAcctDimType());
                po.setYear(reqDto.getYear());
                po.setMonth(reqDto.getMonth());
                aggregateOutAmt = depositAnalysisDao.sumPayInterest(po);
                break;
            case 结算手续费:
//                Q2=Q1+O2 = Q1+(M2-N2)
                BigDecimal q1 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.综合付息,"Q");
                BigDecimal m2 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.结算手续费,"M");
                BigDecimal n2 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.结算手续费,"N");
                aggregateOutAmt = BigDecimalUtils.add(q1,BigDecimalUtils.sub(m2,n2));
                break;
            case 云音响费用:
//                Q3=Q2+O3 = Q2+N3
                BigDecimal q2 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.结算手续费,"Q");
                BigDecimal n3 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.云音响费用,"N");
                aggregateOutAmt = BigDecimalUtils.add(q2,n3);
                break;
            case 绩效和计价:
//                Q4=Q3+O4 = Q3+N4
                BigDecimal q3 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.云音响费用,"Q");
                BigDecimal n4 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.绩效和计价,"N");
                aggregateOutAmt = BigDecimalUtils.add(q3,n4);
                break;
            case 涉贷利息差:
//                Q5=Q4+O5 = Q4+(M5-N5)
                BigDecimal q4 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.绩效和计价,"Q");
                BigDecimal m5 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.涉贷利息差,"M");
                BigDecimal n5 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.涉贷利息差,"N");
                aggregateOutAmt = BigDecimalUtils.add(q4,BigDecimalUtils.sub(m5,n5));
                break;
            default:
                aggregateOutAmt = BigDecimal.ZERO;
        }
        AccountItemTypeUtil.putResult(itemType,"Q",aggregateOutAmt);
        return aggregateOutAmt;
    }

    /**
     * 模拟利率（按年/月） 记：P列
     * 综合付息(P1)：P1=CS=(Ds/Bs*100%)=合计（（模拟付息/期间日均）*100）
     * 结算手续费(P2)：P2=Q2/Bs*100%=(累计支出/期间日均)*100
     * 云音响费用(P3)：P3=Q3/Bs*100%=(累计支出/期间日均)*100
     * 绩效和计价(P4)：P4=Q4/Bs*100%=(累计支出/期间日均)*100
     * 涉贷利息差(P5)：P5=Q5/Bs*100%=(累计支出/期间日均)*100
     */
    public BigDecimal rate(TaskAcctDTO reqDto, AccountItemTypeEnum itemType, List<AccountInfoPO> acctList){
        BigDecimal rate;
        //todo
        BigDecimal bs = new BigDecimal(0);
        switch (itemType) {
            case 综合付息:
//                P1=CS=(Ds/Bs*100%)
                AcctAnalysisPO po = new AcctAnalysisPO();
                po.setIntervalType(reqDto.getIntervalType());
                po.setAcctDimType(reqDto.getAcctDimType());
                po.setYear(reqDto.getYear());
                po.setMonth(reqDto.getMonth());
                BigDecimal ds = depositAnalysisDao.sumPayInterest(po);
                rate = BigDecimalUtils.mul(BigDecimalUtils.div(ds,bs,8),new BigDecimal(100));
                break;
            case 结算手续费:
//                P2=Q2/Bs*100%
                BigDecimal q2 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.结算手续费,"Q");
                rate = BigDecimalUtils.mul(BigDecimalUtils.div(q2,bs,8),new BigDecimal(100));
                break;
            case 云音响费用:
//                P3=Q3/Bs*100%
                BigDecimal q3 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.云音响费用,"Q");
                rate = BigDecimalUtils.mul(BigDecimalUtils.div(q3,bs,8),new BigDecimal(100));
                break;
            case 绩效和计价:
//                P4=Q4/Bs*100%
                BigDecimal q4 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.绩效和计价,"Q");
                rate = BigDecimalUtils.mul(BigDecimalUtils.div(q4,bs,8),new BigDecimal(100));
                break;
            case 涉贷利息差:
//                P5=Q5/Bs*100%
                BigDecimal q5 = AccountItemTypeUtil.getResult(AccountItemTypeEnum.涉贷利息差,"Q");
                rate = BigDecimalUtils.mul(BigDecimalUtils.div(q5,bs,8),new BigDecimal(100));
                break;
            default:
                rate = BigDecimal.ZERO;
        }
        AccountItemTypeUtil.putResult(itemType,"P",rate);
        return rate;
    }



}
